#include "city.h"
#include <QtMath>
#include <QStringList>

City::DistanceMode City::disMode = City::Euclidean;

City::City(QString name, QPointF lonLan):lon_lan(lonLan),m_name(name)
{
    coor = lonLanToCoor(lon_lan);
}

City::City(QStringList info)
{
    m_name = info.at(0);
    lon_lan = QPointF(info.at(1).toFloat(),info.at(2).toFloat());
    coor = lonLanToCoor(lon_lan);
}

QPointF City::lonLanToCoor(QPointF lon_lan){
    return lon_lan;
}

//QPointF City::lonLanToCoor(QPointF lon_lan)
//{
//    float L0=121.464467;//121.464467是投影坐标系的中心纬度，不同城市不同

//    float lon = lon_lan.x();
//    float lan = lon_lan.y();

//    // 参考：https://blog.csdn.net/pulian1508/article/details/120834185
//    float a = 6378137.0;    // WGS84参考椭球参数
//    float b = 6356752.3142; // 短轴

//    float e2 = (a * a - b * b) / (a * a);
//    float A = 1 + 3 * e2 / 4 + 45 * e2 * e2 / 64 + 175 * e2 * e2 * e2 / 256 + 11025 * pow(e2, 4) / 16384 + 43659 * pow(e2, 5) / 65536 + 693693 * pow(e2, 6) / 1048576;
//    float B = A - 1;
//    float C = 15 * e2 * e2 * e2 / 32 + 175 * e2 * e2 * e2 / 384 + 3675 * pow(e2, 4) / 8192 + 14553 * pow(e2, 5) / 32768 + 231231 * pow(e2, 6) / 524288;
//    float D = 35 * e2 * e2 * e2 / 96 + 735 * pow(e2, 4) / 2048 + 14553 * pow(e2, 5) / 40960 + 231231 * pow(e2, 6) / 655360;
//    float E = pow(e2, 4) * 315 / 1024 + pow(e2, 5) * 6237 / 20480 + pow(e2, 6) * 99099 / 327680;
//    float F = 693 * pow(e2, 5) / 2560 + 11011 * pow(e2, 6) / 40960;
//    float G = 1001 * pow(e2, 6) / 4096;
//    float B1 = 0 / 180 * M_PI;
//    float B2 = lan / 180 * M_PI;
//    float S = a * (1 - e2) * (A * (B2 - B1) - B * (sin(B2) * cos(B2) - sin(B1) * cos(B1)) - C * (pow(sin(B2), 3) * cos(B2) - pow(sin(B1), 3) * cos(B1)) - D * (pow(sin(B2), 5) * cos(B2) - pow(sin(B1), 5) * cos(B1)) - E * (pow(sin(B2), 7) * cos(B2) - pow(sin(B1), 7) * cos(B1)) - F * (pow(sin(B2), 9) * cos(B2) - pow(sin(B1), 9) * cos(B1)) - G * (pow(sin(B2), 11) * cos(B2) - pow(sin(B1), 11) * cos(B1)));

//    float LAN_RAD=lan/180*M_PI;
//    float LON_RAD=lon/180*M_PI;
//    float L0_RAD = L0/180*M_PI;

//    //float e = qSqrt(a*a-b*b)/a;
//    float e1 = qSqrt(a*a-b*b)/b;
//    float V = qSqrt(1+e1*e1*cos(LAN_RAD)*cos(LAN_RAD));
//    float c = a*a/b;
//    //float M = c/(V*V*V);
//    float N = c/V;
//    float t = tan(B);
//    float n = qSqrt(e1*e1*cos(LAN_RAD)*cos(LAN_RAD));
//    float l = LON_RAD-L0_RAD;

//    float x = S+N*t*cos(LAN_RAD)*cos(LAN_RAD)*l*l*(0.5 + (1 / 24) * (5 - t * t + 9 * n * n + 4 * n * n * n * n) * cos(LAN_RAD) * cos(LAN_RAD) * l * l + 1 / 720 * (61 - 58 * t * t + t * t * t * t) * pow((cos(LAN_RAD)), 4) * l * l * l * l);
//    float y = N * cos(LAN_RAD) * l * (1 + 1 / 6 * (1 - t * t + n * n) * cos(LAN_RAD) * cos(LAN_RAD) * l * l + 1 / 120 * (5 - 18 * t * t + t * t * t * t + 14 * n * n - 58 * t * t * n * n) * pow((cos(LAN_RAD)), 4) * l * l * l * l);
//    return QPoint(x,y);
//}

//QPointF City::lonLanToCoor(QPointF lon_lan)
//{
//    float l = lon_lan.x();
//    float B = lon_lan.y();
//    l = l * M_PI / 180;
//    B = B * M_PI / 180;

//    double B0 = 30 * M_PI / 180;

//    double N = 0, e = 0, a = 0, b = 0, e2 = 0, K = 0;
//    a = 6378137;
//    b = 6356752.3142;
//    e = qSqrt(1 - (b / a) * (b / a));
//    e2 = qSqrt((a / b) * (a / b) - 1);
//    double CosB0 = cos(B0);
//    N = (a * a / b) / qSqrt(1 + e2 * e2 * CosB0 * CosB0);
//    K = N * CosB0;

//    double Pi = M_PI;
//    double SinB = sin(B);

//    double tan = qTan(Pi / 4 + B / 2);
//    double E2 = pow((1 - e * SinB) / (1 + e * SinB), e / 2);
//    double xx = tan * E2;

//    float xc = K * log(xx);
//    float yc = K * l;
//    return QPointF(xc,yc);
//}

float operator-(City c1, City c2)
{ // 用减号计算两城市间的距离
    float x1 = c1.x(), y1 = c1.y();
    float x2 = c2.x(), y2 = c2.y();
    switch (City::disMode)
    {
        case City::Euclidean:
            return pow((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2), 0.5);
        case City::Manhattan: return (x1 - x2) + (y1 - y2);
        default: return 0.0f;
    }
}
